home *** CD-ROM | disk | FTP | other *** search
- /*
- * the class XY
- * Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
- */
-
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- #include "record.h"
-
- #include "xy.h"
-
- int compare_distance_lt(const XY& p, const XY& q, XYT d)
- {
- XYT dx = p.x() - q.x();
- XYT dy = p.y() - q.y();
- if(dx < 0) {
- dx = - dx;
- }
- if(dy < 0) {
- dy = - dy;
- }
- if((d < dx) || (d < dy)) {
- return false;
- }
- return (dx * dx + dy * dy) < d * d;
- }
-
- double XY::get_radian(const XY& p) const {
- double r = get_distance(p, *this);
- double rate = (p.m_x - m_x) / r;
- if(1.0 < rate) {
- rate = 1.0;
- }
- if(rate < -1.0) {
- rate = -1.0;
- }
- double radian = acos(rate);
-
- if(p.m_y < m_y) {
- radian = M_PI * 2 - radian;
- }
- return radian;
- }
-
- void XY::rotate(const XY& src, double rad)
- {
- const XY tmp = src;
- double c = cos(rad);
- double s = sin(rad);
- set(
- XYT(tmp.x() * c - tmp.y() * s),
- XYT(tmp.x() * s + tmp.y() * c)
- );
- }
-
- bool XY::is_in_box(const XY& p, const XY& q) const
- {
- const XY r = get_min(p, q);
- const XY s = get_max(p, q);
- return (r.x() <= x() && x() <= s.x()
- && r.y() <= y() && y() <= s.y());
- }
-